// See LICENSE.SiFive for license details.

package freechips.rocketchip

import chisel3._
import freechips.rocketchip.util._

package object amba {
  class AMBAProtBundle extends Bundle {
    val bufferable = Bool() // writeback caching ok?
    val modifiable = Bool() // legal to read/write-combine/expand this request?
    val readalloc  = Bool()
    val writealloc = Bool()
    val privileged = Bool() // machine_mode=true,   user_mode=false 用户模式(应用程序的代码在此模式下运行)下可用。两种新的权限模式:运行最可信的代码的机器模式(machine mode)，以及为 Linux，FreeBSD 和 Windows 等操作系统提供支持的监管者模式(supervisor mode)这两种新模式都比用户模式有着更高的权限，其架构称为特权架构，有更多权限的模式通常可以使用权限较低的模式的所用功能，并且它们还有一些低权限模式下不可用的额外功能，例如处理中断和执行 I/O 的功能。处理器通常大部分时间都运行在权限最低的模式下，处理中断和异常时会将控制权移交到更高权限的模式。嵌入式系统运行时(runtime)和操作系统用这些新模式的功能来响应外部事件，如网络数据包的到达、支持多任务处理和任务间保护、抽象和虚拟化硬件功能等。鉴于这些主题的广度，为此而编撰的全面的程序员指南会是另外一本完整的书
    val secure     = Bool() // secure_master=true,  normal=false
    val fetch      = Bool() // instruct_fetch=true, load/store=false
  }

  case object AMBAProt extends ControlKey[AMBAProtBundle]("amba_prot")
  case class AMBAProtField() extends BundleField(AMBAProt) {
    def data = Output(new AMBAProtBundle)
    def default(x: AMBAProtBundle): Unit = {
      x.bufferable := false.B
      x.modifiable := false.B
      x.readalloc  := false.B
      x.writealloc := false.B
      x.privileged := true.B
      x.secure     := true.B
      x.fetch      := false.B
    }
  }

  // Used to convert a TileLink corrupt signal into an AMBA user bit
  case object AMBACorrupt extends DataKey[Bool]("corrupt")
  case class AMBACorruptField() extends BundleField(AMBACorrupt) {
    def data = Output(Bool())
    def default(x: Bool): Unit = { x := false.B }
  }
}
